package com.threeox.commonlibrary.ui.view.inter.engine.base;

import android.app.Activity;
import android.content.Intent;
import android.content.res.Configuration;
import android.support.v4.app.Fragment;
import android.view.KeyEvent;
import android.view.KeyboardShortcutGroup;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;

import com.alibaba.fastjson.JSONObject;
import com.threeox.commonlibrary.entity.engine.event.EventMessage;
import com.threeox.commonlibrary.entity.engine.model.base.BaseModelMsg;
import com.threeox.commonlibrary.entity.engine.request.base.BaseRequestMsg;
import com.threeox.commonlibrary.inter.ILifecycleListener;
import com.threeox.commonlibrary.inter.event.IEventListener;
import com.threeox.commonlibrary.ui.view.engineview.base.CommonModelView;
import com.threeox.commonlibrary.ui.view.inter.reload.IReloadView;
import com.threeox.commonlibrary.util.BroadCastUtils;

import java.util.List;

/**
 *
 * @ClassName: IBaseExtend
 *
 * @Description: TODO(扩展类的基本接口)
 *
 * @author 赵屈犇
 *
 * @date 创建时间: 2017/6/30 18:28
 *
 * @version 1.0
 *
 */
public interface IBaseExtend extends ILifecycleListener, IEventListener, BroadCastUtils.OnBroadcastReceiver {

    /**
     * 初始化模型消息对象
     *
     * @param modelMessage
     * @param commonModelView
     */
    void initModelMessage(BaseModelMsg modelMessage, CommonModelView commonModelView);

    /**
     * Activity 中的初始化
     *
     * @param activity
     */
    void initActivity(Activity activity);

    /**
     * Fragment 中的初始化
     *
     * @param fragment
     */
    void initFragment(Fragment fragment);

    /*=====================校验的回调接口=====================*/

    /**
     * 在校验之前回调
     *
     * @param view
     * @param eventMessage
     * @param value
     * @return
     */
    boolean onBeforeVerify(View view, EventMessage eventMessage, JSONObject value);

    /**
     * 在校验之后回调
     *
     * @param view
     * @param eventMessage
     * @param value
     * @param isVerify
     */
    void onAfterVerify(View view, EventMessage eventMessage, JSONObject value, boolean isVerify);

    /*=====================校验的回调接口=====================*/

    /*====================事件操作 接口实现函数=========================*/

    /**
     * 响应事件之前操作的回调
     *
     * @param view
     * @param eventMessage
     * @param requestParams
     * @param isVerify 是否校验通过
     * @param params
     * @return
     */
    boolean onBeforeEvent(View view, EventMessage eventMessage, JSONObject requestParams, boolean isVerify, Object... params);

    /**
     * 响应事件之后的回调
     *
     * @param view
     * @param eventMessage
     * @param params
     * @return
     */
    void onAfterEvent(View view, EventMessage eventMessage, Object... params);

    /*====================事件操作 接口实现函数=========================*/

    /**
     * 请求数据失败之后的回调
     *
     * @param requestMsg
     * @param url
     * @param id
     * @param code
     * @param msg
     */
    void onRequestError(BaseRequestMsg requestMsg, String url, int id, Object code, String msg);

    /**
     * 请求过程中的回调
     *
     * @param requestMsg
     * @param progress
     * @param total
     * @param id
     * @param url
     */
    void onRequestInProgress(BaseRequestMsg requestMsg, float progress, long total, int id, String url);

    /*=====================各种状态变化的回调接口=====================*/

    /**
     * 请求过程中的回调
     *
     * @param message  加载的提示内容
     *
     * @return
     */
    void requestIn(String message);

    /**
     * 请求失败回调
     *
     * @param data
     *          返回的数据
     * @param msg
     *          错误的信息
     *
     * @return
     */
    void requestFault(Object data, String msg);

    /**
     * 请求成功的回调
     *
     * @param data
     *          返回的数据
     *
     * @return
     */
    void requestSucceed(Object data);

    /**
     * 没有数据的情况
     *
     * @param message
     *
     * @return
     */
    void notData(String message);

    /**
     * 网络关闭的回调
     *
     * @param message
     *
     * @return
     */
    void networkClose(String message);

    /**
     * 网络弱的回调
     *
     * @param message
     * @return
     */
    void networkWeak(String message);

    /*=====================各种状态变化的回调接口=====================*/

    /**
     * 当新Activity关闭后，新Activity返回的数据通过Intent进行传递
     *
     * @param requestCode
     * @param resultCode
     * @param data
     */
    void onActivityResult(int requestCode, int resultCode, Intent data);

    /**
     * 处理权限申请回调
     *
     * @param requestCode
     * @param permissions
     * @param grantResults
     */
    void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults);


    /*==============标题栏的扩展函数==================*/
    /**
     * 左边布局编辑回调
     *
     * @param v
     * @return
     */
    boolean onLeftLayoutClick(View v);

    /**
     * 右边布局编辑回调
     *
     * @param v
     * @return
     */
    void onRightLayoutClick(View v);

    /**
     * 中间布局编辑回调
     *
     * @param v
     * @return
     */
    void onCenterLayoutClick(View v);
    /*==============标题栏的扩展函数==================*/


    /*====================监听手机屏幕的按键=========================*/

    /**
     * 当某个键被按下时会触发，但不会被任何的该Activity内的任何view处理。默认按下KEYCODE_BACK键后会回到上一个Activity。
     *
     * @param keyCode
     * @param event
     * @return
     */
    Boolean onKeyDown(int keyCode, KeyEvent event);

    /**
     * 当某个按键被按下，松开后触发，但不会被任何的该Activity内的任何view处理。 默认没有执行任何操作，只是简单的给一个false作为返回值。
     *
     * @param keyCode
     * @param event
     * @return
     */
    Boolean onKeyUp(int keyCode, KeyEvent event);

    /**
     * 当某个键被长按时会触发
     *
     * @param keyCode
     * @param event
     * @return
     */
    Boolean onKeyLongPress(int keyCode, KeyEvent event);

    /**
     *
     * @param keyCode
     * @param repeatCount
     * @param event
     * @return
     */
    Boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event);

    /**
     *
     * @param keyCode
     * @param event
     * @return
     */
    Boolean onKeyShortcut(int keyCode, KeyEvent event);

    /**
     *
     * @param data
     * @param menu
     * @param deviceId
     */
    void onProvideKeyboardShortcuts(List<KeyboardShortcutGroup> data, Menu menu, int deviceId);

    /**
     * 监听屏幕旋转 语言变换 键盘滑动
     *
     * @param newConfig
     */
    void onConfigurationChanged(Configuration newConfig);

    /**
     * 触摸事件
     *
     * @param event
     * @return
     */
    Boolean onTouchEvent(MotionEvent event);

    /*====================监听手机屏幕的按键=========================*/

}
